スクリプトからPlatformターゲットを変更する

November 08, 2022


現在のPlatformターゲットをBuildSettingsではなくスクリプトから切り替える時。 例えば、プラットフォーム設定をScriptableObjectで管理し、スイッチ時にその設定を流し込みたいなどに利用できると思います

Document

https://docs.unity3d.com/ScriptReference/EditorUserBuildSettings.html

切り替え

切り替えに関しては

public static bool SwitchActiveBuildTarget(BuildTargetGroup targetGroup, BuildTarget target);

が利用できます

SwitchActiveBuildTargetAsync というメソッドもありますが、こちらはスイッチ時にコンパイルを走らせるのではなく次回のEditor更新時のタイミングに合わせてスイッチするようです。 おそらく手動で何らかの処理を事前に入れたいときに利用するのでしょうか

設定ファイル

以下のようなScriptableObjectを用意し、Platform変更時に任意なパラメータを追加できるようにしておきます

/// <summary>
/// Platform環境を切り替える設定
/// </summary>
[CreateAssetMenu(menuName = "Core/PlatformSwitcher/Basic PlatformContext", fileName = "Basic PlatformContext")]
public class PlatformContext : ScriptableObject
{
	[SerializeField] private string _name;
	[SerializeField] private BuildTarget _buildTarget;


	public string Name => _name;

	public BuildTarget BuildTarget => _buildTarget;

	public BuildTargetGroup BuildGroup =>
		_buildTarget switch
		{
				BuildTarget.StandaloneOSX => BuildTargetGroup.Standalone,
				BuildTarget.StandaloneWindows => BuildTargetGroup.Standalone,
				BuildTarget.StandaloneWindows64 => BuildTargetGroup.Standalone,
				BuildTarget.StandaloneLinux64 => BuildTargetGroup.Standalone,

				BuildTarget.Android => BuildTargetGroup.Android,
				BuildTarget.iOS => BuildTargetGroup.iOS,
				BuildTarget.WebGL => BuildTargetGroup.WebGL,

				_ => throw new NotImplementedException()
		};
}

BuildTargetGroupはBuildTargetから求めることが可能なため、SerializeFieldで可視化せずにプロパティでTargetから取得できるようにしています

後はこの設定を利用し以下のように切り替え

EditorUserBuildSettings.SwitchActiveBuildTarget(context.BuildGroup, context.BuildTarget);

切り替え通知

Platform変更したときの通知は IActiveBuildTargetChanged を継承すると受けられます

/// <summary>
/// 切り替えたときに呼び出される
/// </summary>
public void OnActiveBuildTargetChanged(BuildTarget previousTarget, BuildTarget newTarget)
{
}

終わり

EditorWindowと組み合わせて、特定の項目をダブルクリックした時にその項目の設定を適用してから SwitchActiveBuildTarget でターゲットを切り替えが主な使い道になるかと思います

4AE.gif)